// src/prisma.ts
import { PrismaClient } from "@prisma/client";

const prisma = new PrismaClient({ log: ["query", "info", "warn", "error"] });

// 日期格式化函数
const formatDate = (date: Date): string => {
  // 提取 UTC 时间（如果需要本地时间，把 getUTC* 换成 get*）
  const year = date.getFullYear(); // 4位年份（如 2025）
  const month = String(date.getMonth() + 1).padStart(2, "0"); // 月份（01-12，注意+1，因为月份从0开始）
  const day = String(date.getDate()).padStart(2, "0"); // 日期（01-31）
  const hours = String(date.getHours()).padStart(2, "0"); // 小时（00-23，24小时制）
  const minutes = String(date.getMinutes()).padStart(2, "0"); // 分钟（00-59）
  const seconds = String(date.getSeconds()).padStart(2, "0"); // 秒（00-59）

  // 拼接成 "xxxx-xx-xx xx:xx:xx"
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};

// 提取所有模型名类型
type ModelName = keyof typeof prisma;

// 通用查询扩展生成器
function withDates<T extends ModelName>(model: T) {
  return {
    findMany: async (args: any) => {
      const result = await (prisma[model] as any).findMany(args);
      return Array.isArray(result)
        ? result.map(addFormattedDates)
        : addFormattedDates(result);
    },
    findUnique: async (args: any) => {
      const result = await (prisma[model] as any).findUnique(args);
      return result ? addFormattedDates(result) : null;
    },
    findFirst: async (args: any) => {
      const result = await (prisma[model] as any).findFirst(args);
      return result ? addFormattedDates(result) : null;
    },
  };
}

// 为结果添加格式化日期字段
function addFormattedDates<T extends Record<string, any>>(data: T): T {
  const result = { ...data };

  Object.keys(result).forEach((key) => {
    if (
      result[key] instanceof Date &&
      (key.includes("At") ||
        key.includes("Date") ||
        key.includes("_at") ||
        key.includes("_date"))
    ) {
      (result as any)[`${key}_formatted`] = formatDate(result[key]);
    }
  });

  return result;
}

// 扩展后的 Prisma Client
// const prismaExtended = prisma.$extends({
//   model: {
//     // 在这里为每个模型添加扩展
//     // 只需一行代码即可为整个模型添加所有支持的方法
//     user: { ...withDates("user") },
//     blog: { ...withDates("blog") },
//     // comment: { ...withDates("comment") },
//     // 有新模型时，只需在这里添加一行
//   },
// });
const prismaExtended = prisma.$extends({});
export default prismaExtended;
